# @Time : 2020/7/31 13:52
# @Author : Fioman 
# @Phone : 13149920693
import cv2 as cv
import numpy as np

"""
逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它.凸包跟逼近多边形很像,只不过它是物体最外层的凸多边形.
凸包指的是完全包含原有轮廓,并且仅由轮廓上的点说构成的多边形.凸包的每一处都是凸的,即在凸包内连接任意两点的直线都在凸包内部.
在凸包内,任意连接三个点的内角小于180度.
Opencv提供了函数cv.convexHull()用于获取轮廓的凸包.
hull = cv.convexHull(points,clockwise,returnPoints)
式子中的返回值hull为凸包角点.
参数如下:
points: 轮廓
clockwise: 布尔类型值.该值为True时,凸包角点按顺时针方向排列;该值为False时,则以逆时针方向排列凸包角点.
returnPoints: 布尔类型值.默认值是True,函数返回凸包角点的x/y轴坐标;
当为False时,函数返回轮廓中凸包角点的索引.
"""
img = cv.imread("contours.bmp")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
T,thres = cv.threshold(gray,127,255,cv.THRESH_BINARY)
image,contours,hierarchy = cv.findContours(thres,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)

hull = cv.convexHull(contours[0]) # 返回坐标值
print("returnPoints为默认值True时返回值hull的值: {}".format(hull))

hull2 = cv.convexHull(contours[0],returnPoints=False) # 返回索引值
print("returnPoints为False时返回值hull的值: {}".format(hull2))

img = cv.imread("hand.bmp")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
T2,thres2 = cv.threshold(gray,127,255,cv.THRESH_BINARY)
image2,contours2,hierarchy2 = cv.findContours(thres2,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
cv.imshow("Original",img)

hull = cv.convexHull(contours2[0])

# 绘制凸包
cv.polylines(img,[hull],True,(0,255,0),1)

cv.imshow("Hull",img)
cv.waitKey(0)
"""
凸包与轮廓之间的部分,称为凸缺陷.在Opencv中使用函数cv.convexityDefects()获取凸缺陷.
"""
































